package jp.co.nes.awssupport.common.bean;

import java.time.YearMonth;
import java.time.ZonedDateTime;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverted;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersionAttribute;

import jp.co.nes.awssupport.common.dao.YearMonthConverter;
import jp.co.nes.awssupport.common.dao.ZonedDateTimeConverter;

/**
 * 集計進捗状況です。<br>
 * 連結アカウント単位の処理に関する集計進捗状況を保持します。
 */
@DynamoDBTable(tableName = "CompileProgress")
public class CompileProgressBean extends BaseBean {

    /** serialVersionUID */
    private static final long serialVersionUID = 1L;

    /** 連結アカウントID */
    private String linkedAccountId;

    /** 処理対象年月 */
    private YearMonth targetYearMonth;

    /** 集計処理トピック送信完了日時 */
    private ZonedDateTime topicPublishCompletionDate;

    /** 集計処理呼び出し完了日時 */
    private ZonedDateTime processStartCompletionDate;

    /** 集計処理呼び出し失敗日時 */
    private ZonedDateTime processStartFailureDate;

    /** 融通リザーブド管理出力完了日時 */
    private ZonedDateTime blendedReservedManageCompletionDate;

    /** 日時集計結果出力完了日時 */
    private ZonedDateTime dailyCompiledBillingCompletionDate;

    /** 月次集計結果出力完了日時 */
    private ZonedDateTime monthlyCompiledBillingCompletionDate;

    /** キャンペーンプラン適用完了日時 */
    private ZonedDateTime campaignPlanCompletionDate;

    /** クレジット適用完了日時 */
    private ZonedDateTime creditCouponCompletionDate;

    /** 雑費適用完了日時 */
    private ZonedDateTime miscellaneousExpensesPlanCompletionDate;

    /** プレミアムサポート適用完了日時 */
    private ZonedDateTime premiumSupportCompletionDate;

    /** 税金プラン適用完了日時 */
    private ZonedDateTime taxPlanCompletionDate;

    /** 集計処理失敗日時 */
    private ZonedDateTime processFailureDate;

    /** バージョンNo. */
    private Long versionNo;

    /**
     * デフォルトコンストラクタです。
     */
    public CompileProgressBean() {
    }

    /**
     * 連結アカウントIDを返却します。
     *
     * @return 連結アカウントID
     */
    @DynamoDBHashKey
    public String getLinkedAccountId() {
        return linkedAccountId;
    }

    /**
     * 連結アカウントIDを設定します。
     *
     * @param linkedAccountId 連結アカウントID
     */
    public void setLinkedAccountId(String linkedAccountId) {
        this.linkedAccountId = linkedAccountId;
    }

    /**
     * 処理対象年月を返却します。
     *
     * @return 処理対象年月
     */
    @DynamoDBRangeKey
    @DynamoDBTypeConverted(converter = YearMonthConverter.class)
    public YearMonth getTargetYearMonth() {
        return targetYearMonth;
    }

    /**
     * 処理対象年月を設定します。
     *
     * @param targetYearMonth 処理対象年月
     */
    public void setTargetYearMonth(YearMonth targetYearMonth) {
        this.targetYearMonth = targetYearMonth;
    }

    /**
     * 集計処理トピック送信完了日時を返却します。
     *
     * @return 集計処理トピック送信完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getTopicPublishCompletionDate() {
        return topicPublishCompletionDate;
    }

    /**
     * 集計処理トピック送信完了日時を設定します。
     *
     * @param topicPublishCompletionDate 集計処理トピック送信完了日時
     */
    public void setTopicPublishCompletionDate(ZonedDateTime topicPublishCompletionDate) {
        this.topicPublishCompletionDate = topicPublishCompletionDate;
    }

    /**
     * 集計処理呼び出し完了日時を返却します。
     *
     * @return 集計処理呼び出し完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getProcessStartCompletionDate() {
        return processStartCompletionDate;
    }

    /**
     * 集計処理呼び出し完了日時を設定します。
     *
     * @param processStartCompletionDate 集計処理呼び出し完了日時
     */
    public void setProcessStartCompletionDate(ZonedDateTime processStartCompletionDate) {
        this.processStartCompletionDate = processStartCompletionDate;
    }

    /**
     * 集計処理呼び出し失敗日時を返却します。
     *
     * @return 集計処理呼び出し失敗日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getProcessStartFailureDate() {
        return processStartFailureDate;
    }

    /**
     * 集計処理呼び出し失敗日時を設定します。
     *
     * @param processStartFailureDate 集計処理呼び出し失敗日時
     */
    public void setProcessStartFailureDate(ZonedDateTime processStartFailureDate) {
        this.processStartFailureDate = processStartFailureDate;
    }

    /**
     * 融通リザーブド管理出力完了日時を返却します。
     *
     * @return 融通リザーブド管理出力完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getBlendedReservedManageCompletionDate() {
        return blendedReservedManageCompletionDate;
    }

    /**
     * 融通リザーブド管理出力完了日時を設定します。
     *
     * @param blendedReservedManageCompletionDate 融通リザーブド管理出力完了日時
     */
    public void setBlendedReservedManageCompletionDate(ZonedDateTime blendedReservedManageCompletionDate) {
        this.blendedReservedManageCompletionDate = blendedReservedManageCompletionDate;
    }

    /**
     * 日時集計結果出力完了日時を返却します。
     *
     * @return 日時集計結果出力完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getDailyCompiledBillingCompletionDate() {
        return dailyCompiledBillingCompletionDate;
    }

    /**
     * 日時集計結果出力完了日時を設定します。
     *
     * @param dailyCompiledBillingCompletionDate 日時集計結果出力完了日時
     */
    public void setDailyCompiledBillingCompletionDate(ZonedDateTime dailyCompiledBillingCompletionDate) {
        this.dailyCompiledBillingCompletionDate = dailyCompiledBillingCompletionDate;
    }

    /**
     * 月次集計結果出力完了日時を設定します。
     *
     * @return 月次集計結果出力(ボリューミングプラン適用)完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getMonthlyCompiledBillingCompletionDate() {
        return monthlyCompiledBillingCompletionDate;
    }

    /**
     * 月次集計結果出力完了日時を返却します。
     *
     * @param monthlyCompiledBillingCompletionDate 月次集計結果出力完了日時
     */
    public void setMonthlyCompiledBillingCompletionDate(ZonedDateTime monthlyCompiledBillingCompletionDate) {
        this.monthlyCompiledBillingCompletionDate = monthlyCompiledBillingCompletionDate;
    }

    /**
     * キャンペーンプラン適用完了日時を返却します。
     *
     * @return キャンペーンプラン適用完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getCampaignPlanCompletionDate() {
        return campaignPlanCompletionDate;
    }

    /**
     * キャンペーンプラン適用完了日時を設定します。
     *
     * @param campaignPlanCompletionDate キャンペーンプラン適用完了日時
     */
    public void setCampaignPlanCompletionDate(ZonedDateTime campaignPlanCompletionDate) {
        this.campaignPlanCompletionDate = campaignPlanCompletionDate;
    }

    /**
     * クレジット適用完了日時を返却します。
     *
     * @return クレジット適用完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getCreditCouponCompletionDate() {
        return creditCouponCompletionDate;
    }

    /**
     * クレジット適用完了日時を設定します。
     *
     * @param creditCouponCompletionDate クレジット適用完了日時
     */
    public void setCreditCouponCompletionDate(ZonedDateTime creditCouponCompletionDate) {
        this.creditCouponCompletionDate = creditCouponCompletionDate;
    }

    /**
     * 雑費適用完了日時を返却します。
     *
     * @return 雑費適用完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getMiscellaneousExpensesPlanCompletionDate() {
        return miscellaneousExpensesPlanCompletionDate;
    }

    /**
     * 雑費適用完了日時を設定します。
     *
     * @param miscellaneousExpensesPlanCompletionDate 雑費適用完了日時
     */
    public void setMiscellaneousExpensesPlanCompletionDate(ZonedDateTime miscellaneousExpensesPlanCompletionDate) {
        this.miscellaneousExpensesPlanCompletionDate = miscellaneousExpensesPlanCompletionDate;
    }

    /**
     * プレミアムサポート適用完了日時を返却します。
     *
     * @return プレミアムサポート適用完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getPremiumSupportCompletionDate() {
        return premiumSupportCompletionDate;
    }

    /**
     * プレミアムサポート適用完了日時を設定します。
     *
     * @param premiumSupportCompletionDate プレミアムサポート適用完了日時
     */
    public void setPremiumSupportCompletionDate(ZonedDateTime premiumSupportCompletionDate) {
        this.premiumSupportCompletionDate = premiumSupportCompletionDate;
    }

    /**
     * 税金プラン適用完了日時を返却します。
     *
     * @return 税金プラン適用完了日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getTaxPlanCompletionDate() {
        return taxPlanCompletionDate;
    }

    /**
     * 税金プラン適用完了日時を設定します。
     *
     * @param taxPlanCompletionDate 税金プラン適用完了日時
     */
    public void setTaxPlanCompletionDate(ZonedDateTime taxPlanCompletionDate) {
        this.taxPlanCompletionDate = taxPlanCompletionDate;
    }

    /**
     * 集計処理失敗日時を返却します。
     *
     * @return 集計処理失敗日時
     */
    @DynamoDBTypeConverted(converter = ZonedDateTimeConverter.class)
    public ZonedDateTime getProcessFailureDate() {
        return processFailureDate;
    }

    /**
     * 集計処理失敗日時を設定します。
     *
     * @param processFailureDate 集計処理失敗日時
     */
    public void setProcessFailureDate(ZonedDateTime processFailureDate) {
        this.processFailureDate = processFailureDate;
    }

    /**
     * バージョンNo.を返却します。
     *
     * @return バージョンNo.
     */
    @DynamoDBVersionAttribute
    public Long getVersionNo() {
        return versionNo;
    }

    /**
     * バージョンNo.を設定します。
     *
     * @param versionNo バージョンNo.
     */
    public void setVersionNo(Long versionNo) {
        this.versionNo = versionNo;
    }
}
